package com.xuecheng.content.controller;


import com.xuecheng.api.content.model.api.FileManagerApi;
import com.xuecheng.api.content.model.file.UploadTokenResult;
import com.xuecheng.common.exception.ExceptionCast;
import com.xuecheng.content.common.constant.ContentErrorCode;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.RandomStringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * <p></p>
 *
 * @Description:
 */
@Slf4j
@RestController
public class FileManagerController implements FileManagerApi {

    @Autowired
    private RestTemplate restTemplate;

    /*
    *
    #文件系统微服的请求地址
    file.service.url=http://127.0.0.1:56082/farming/generatetoken?origin=qiniu
    #文件存储空间名称
    file.service.bucket=xc142-static-imgs

    #文件存储区域的地址
    file.service.upload.region = http://upload.qiniu.com
    #文件访问的cdn加速域名
    cdn.domain = rdr820mmk.hd-bkt.clouddn.com
    file.token.type = 1
    file.token.deadline = 3600
    *
    * */
    @Value("${file.service.url}")
    private String url;
    @Value("${file.service.bucket}")
    private String bucket;
    @Value("${file.service.upload.region}")
    private String region;
    @Value("${cdn.domain}")
    private String domain;
    @Value("${file.token.type}")
    private String type;
    @Value("${file.token.deadline}")
    private int deadline;




    @GetMapping("common/qnUploadToken")
    public UploadTokenResult genarateUploadToken() {

        // 构建请求体中的json数据
        /*
        * {
              "tokenType":"1",
              "scope":"xc142-static-imgs",
              "deadline":3600,
              "key":"111xxxeeee"
            }
        * */
        HashMap<String, Object> requestHeader = new HashMap<>();
        requestHeader.put("tokenType",type);
        requestHeader.put("scope",bucket);
        requestHeader.put("deadline",deadline);

        // 七牛的文件唯一性
        // UUID+随机字符串（16）
        String key = UUID.randomUUID().toString() + RandomStringUtils.randomAlphanumeric(16);

        requestHeader.put("key",key);


        // 1.发送请求获得上传的凭证
        /*
        * 参数：
        *   1.路径地址
        *   2.请求体中的数据
        *   3.对于响应后的内容封装类型
        *   4.请求路径中的参数（可选）
        * */
        ResponseEntity<Map> responseEntity = restTemplate.postForEntity(url, requestHeader, Map.class);

        // 响应成功为：200
        int statusCodeValue = responseEntity.getStatusCodeValue();
        int okCode = HttpStatus.OK.value();

        if (okCode!= statusCodeValue) {
            log.error(ContentErrorCode.E_1200601.getDesc()+" 错误code：{}",statusCodeValue);
            ExceptionCast.cast(ContentErrorCode.E_1200601);
        }



        // 2.将数据结果进行封装并返回给前端
        Map body = responseEntity.getBody();


        UploadTokenResult result = UploadTokenResult.builder().
                qnToken(body.get("result").toString())
                .tokenType(type)
                .domain(domain)
                .scope(bucket)
                .up_region(region)
                .key(key)
                .deadline(deadline)
                .build();


        return result;
    }
}
